package main

import (
	"fmt"
	"os"
	"task_queue/global"
	"task_queue/internal/config"
	"task_queue/internal/database"
	"task_queue/internal/middleware"
	"task_queue/internal/routes" // <-- 导入新的 routes 包

	"github.com/gin-contrib/cors"
	"github.com/gin-gonic/gin"
	"github.com/joho/godotenv"
	"github.com/spf13/viper"
	"go.uber.org/zap"
	"gorm.io/gorm"
)

var appEnv string

func main() {
	// 1. 先加载 .env 文件
	loadEnv()
	// 2. 立即读取 APP_ENV
	appEnv = os.Getenv("APP_ENV")
	fmt.Println("environment is ", appEnv) // 确认环境变量是否加载成功

	// 3. 初始化 logger
	logger := initLogger()

	// 4. 初始化配置
	initConfig(logger)
	// 5. 初始化数据库，传入 appEnv
	db := initDatabase(appEnv, logger)
	global.InitGlobalP(db, logger)

	// 6. 设置 Gin 引擎，传入 appEnv
	r := setupGinEngine(appEnv) // 传入 appEnv

	// 7. 注册路由 <--- 新增步骤
	routes.RegisterRoutes(r, db) // 调用新的路由注册函数

	// 9. 启动服务器
	startServer(r, logger) // 保持不变
}

func loadEnv() {
	// 确保 .env 文件在程序运行的目录下
	if err := godotenv.Load(); err != nil {
		// 使用 fmt 而不是 logger，因为 logger 可能还没初始化
		fmt.Println("警告: 加载 .env 文件失败:", err)
	} else {
		fmt.Println(".env 文件加载成功")
	}
}

func initLogger() *zap.Logger {
	logger, _ := zap.NewProduction()
	defer logger.Sync()
	return logger
}

func initConfig(logger *zap.Logger) {
	if err := config.InitConfig("configs"); err != nil {
		logger.Fatal("Failed to read config file", zap.Error(err))
	}
}

func initDatabase(mode string, logger *zap.Logger) *gorm.DB { // mode 参数现在有值了
	db, err := database.InitDB(mode, logger)
	if err != nil {
		logger.Fatal("Database initialization failed", zap.Error(err))
	}
	return db
}

// setupGinEngine 接收 appEnv 作为参数
func setupGinEngine(envMode string) *gin.Engine {
	switch envMode { // 使用传入的参数
	case "production":
		gin.SetMode(gin.ReleaseMode)
	case "test":
		gin.SetMode(gin.TestMode)
	default:
		gin.SetMode(gin.DebugMode)
	}

	r := gin.Default()
	config := cors.DefaultConfig()
	config.AllowAllOrigins = true                                                                                          // 允许所有来源
	config.AllowMethods = []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}                                              // 允许的方法
	config.AllowHeaders = []string{"Origin", "Content-Length", "Content-Type", "Authorization", "X-Token", "X-Request-Id"} // 允许的头部

	// 应用 RequestID 中间件
	r.Use(cors.New(config)).Use(middleware.RequestIDMiddleware())

	if envMode == "production" { // 使用传入的参数
		r.SetTrustedProxies([]string{"192.168.1.0/24"})
	}

	return r
}

func startServer(r *gin.Engine, logger *zap.Logger) {
	port := viper.GetString("server.port")
	if port == "" {
		port = "8080"
	}

	logger.Info("Starting server", zap.String("port", port))
	if err := r.Run(":" + port); err != nil {
		logger.Fatal("Failed to start server", zap.Error(err))
	}
}
